Telegram Group & Telegram Channel
🧩 Задача для продвинутых дата-сайентистов: "Парадоксальная корреляция"

📖 Описание задачи

У вас есть DataFrame df с данными о рекламных кампаниях:


import pandas as pd

data = {
'campaign_id': [1, 2, 3, 4, 5, 6],
'spend': [1000, 1500, 1200, None, 2000, 1700],
'revenue': [2000, 2300, 2500, 1800, None, 2700]
}

df = pd.DataFrame(data)
print(df)


Результат:


campaign_id spend revenue
0 1 1000.0 2000.0
1 2 1500.0 2300.0
2 3 1200.0 2500.0
3 4 NaN 1800.0
4 5 2000.0 NaN
5 6 1700.0 2700.0


Вам нужно посчитать корреляцию между spend и revenue.

Вы пишете:


correlation = df['spend'].corr(df['revenue'])
print(correlation)


И получаете:


nan


❗️Но вы уверены, что данные связаны (чем больше spend, тем больше revenue), а Pandas возвращает NaN.

📝 Ваша задача:

1. Почему Pandas возвращает NaN?
2. Как правильно посчитать корреляцию?
3. Как бы вы обработали такие данные в продакшн-пайплайне?

---

🎯 Подвох (ключевой момент):

Метод corr() автоматически игнорирует строки, где хотя бы одно значение NaN.

В этом DataFrame остаются только строки с индексами 0, 1, 2, 5.
→ На этих данных корреляция может быть рассчитана.

Но главная проблема — тип данных.

Если данные были считаны, например, из CSV, где пустые значения остались строками, то Pandas определит колонку как object, а не float64:


print(df.dtypes)


Вывод:


spend object
revenue object


И тогда corr() вернёт NaN, потому что не смог интерпретировать данные как числовые.

---

💡 Решение:

1. Проверить типы данных:

```python
print(df.dtypes)
```

2. Привести к числовому типу:

```python
df['spend'] = pd.to_numeric(df['spend'], errors='coerce')
df['revenue'] = pd.to_numeric(df['revenue'], errors='coerce')
```

3. Посчитать корреляцию без NaN:

```python
correlation = df[['spend', 'revenue']].dropna().corr().iloc[0, 1]
print(correlation)
```

Теперь корреляция рассчитана корректно.

---

🔥 Дополнительный подвох:

А что если CSV-файл считан с
delimiter=';', а данные внутри разделены запятыми?
→ Тогда весь DataFrame будет одной колонкой с типом object, а Pandas не сможет даже начать обработку.

---

📝 Что проверяет задача:

Понимание, как Pandas обрабатывает NaN и object
Внимательность к типам данных
Умение находить ошибки при чтении и парсинге данных
Опыт очистки и предобработки грязных данных

🔥 Отличная проверка на внимательность и глубину работы с Pandas!



tg-me.com/machinelearning_interview/1787
Create:
Last Update:

🧩 Задача для продвинутых дата-сайентистов: "Парадоксальная корреляция"

📖 Описание задачи

У вас есть DataFrame df с данными о рекламных кампаниях:


import pandas as pd

data = {
'campaign_id': [1, 2, 3, 4, 5, 6],
'spend': [1000, 1500, 1200, None, 2000, 1700],
'revenue': [2000, 2300, 2500, 1800, None, 2700]
}

df = pd.DataFrame(data)
print(df)


Результат:


campaign_id spend revenue
0 1 1000.0 2000.0
1 2 1500.0 2300.0
2 3 1200.0 2500.0
3 4 NaN 1800.0
4 5 2000.0 NaN
5 6 1700.0 2700.0


Вам нужно посчитать корреляцию между spend и revenue.

Вы пишете:


correlation = df['spend'].corr(df['revenue'])
print(correlation)


И получаете:


nan


❗️Но вы уверены, что данные связаны (чем больше spend, тем больше revenue), а Pandas возвращает NaN.

📝 Ваша задача:

1. Почему Pandas возвращает NaN?
2. Как правильно посчитать корреляцию?
3. Как бы вы обработали такие данные в продакшн-пайплайне?

---

🎯 Подвох (ключевой момент):

Метод corr() автоматически игнорирует строки, где хотя бы одно значение NaN.

В этом DataFrame остаются только строки с индексами 0, 1, 2, 5.
→ На этих данных корреляция может быть рассчитана.

Но главная проблема — тип данных.

Если данные были считаны, например, из CSV, где пустые значения остались строками, то Pandas определит колонку как object, а не float64:


print(df.dtypes)


Вывод:


spend object
revenue object


И тогда corr() вернёт NaN, потому что не смог интерпретировать данные как числовые.

---

💡 Решение:

1. Проверить типы данных:

```python
print(df.dtypes)
```

2. Привести к числовому типу:

```python
df['spend'] = pd.to_numeric(df['spend'], errors='coerce')
df['revenue'] = pd.to_numeric(df['revenue'], errors='coerce')
```

3. Посчитать корреляцию без NaN:

```python
correlation = df[['spend', 'revenue']].dropna().corr().iloc[0, 1]
print(correlation)
```

Теперь корреляция рассчитана корректно.

---

🔥 Дополнительный подвох:

А что если CSV-файл считан с
delimiter=';', а данные внутри разделены запятыми?
→ Тогда весь DataFrame будет одной колонкой с типом object, а Pandas не сможет даже начать обработку.

---

📝 Что проверяет задача:

Понимание, как Pandas обрабатывает NaN и object
Внимательность к типам данных
Умение находить ошибки при чтении и парсинге данных
Опыт очистки и предобработки грязных данных

🔥 Отличная проверка на внимательность и глубину работы с Pandas!

BY Machine learning Interview


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/machinelearning_interview/1787

View MORE
Open in Telegram


Machine learning Interview Telegram | DID YOU KNOW?

Date: |

The S&P 500 slumped 1.8% on Monday and Tuesday, thanks to China Evergrande, the Chinese property company that looks like it is ready to default on its more-than $300 billion in debt. Cries of the next Lehman Brothers—or maybe the next Silverado?—echoed through the canyons of Wall Street as investors prepared for the worst.

Among the actives, Ascendas REIT sank 0.64 percent, while CapitaLand Integrated Commercial Trust plummeted 1.42 percent, City Developments plunged 1.12 percent, Dairy Farm International tumbled 0.86 percent, DBS Group skidded 0.68 percent, Genting Singapore retreated 0.67 percent, Hongkong Land climbed 1.30 percent, Mapletree Commercial Trust lost 0.47 percent, Mapletree Logistics Trust tanked 0.95 percent, Oversea-Chinese Banking Corporation dropped 0.61 percent, SATS rose 0.24 percent, SembCorp Industries shed 0.54 percent, Singapore Airlines surrendered 0.79 percent, Singapore Exchange slid 0.30 percent, Singapore Press Holdings declined 1.03 percent, Singapore Technologies Engineering dipped 0.26 percent, SingTel advanced 0.81 percent, United Overseas Bank fell 0.39 percent, Wilmar International eased 0.24 percent, Yangzijiang Shipbuilding jumped 1.42 percent and Keppel Corp, Thai Beverage, CapitaLand and Comfort DelGro were unchanged.

Machine learning Interview from us


Telegram Machine learning Interview
FROM USA